package br.com.lm.view;

import br.com.lm.geral.util.MessageProvider;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

/**
 * @author Robson Motta
 */ 
public class LanguageBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private String localeCode;
    private Map<String, String> paises;
    private MessageProvider messageProvider;
 
    public LanguageBean() {
        //Nota: O default Locale no faces-config é obtido em tempo de request e não por sessao
        //      Para manter os valores em outras View(s):
        //   1) Defina o Este Bean com escopo de Sessão
        //   2) Defina a entrada na pagina JSF:  <f:view locale="#{languageBean.localeCode}" />
        localeCode = FacesContext.getCurrentInstance().getApplication().getDefaultLocale().toString();
        //         = FacesContext.getCurrentInstance().getViewRoot().getLocale().toString();
        createMapIdiomas();
    }
    
    private void createMapIdiomas() {         
        paises = new LinkedHashMap<String, String>();
        if (messageProvider == null)
            messageProvider = new MessageProvider("msgPool");
 
        String strIdiomas = messageProvider.getValueFromKey("system.idiomas");
        String strLocales = messageProvider.getValueFromKey("system.locale");
        
        if (strIdiomas != null && strLocales != null) {
            String[] idiomas = strIdiomas.split("[|]"); //Regular Expression para PIPE
            String[] pLocale = strLocales.split("[|]"); //Regular Expression para PIPE
            if (idiomas.length == pLocale.length) {
                for (int i = 0; i < idiomas.length; i++) 
                    paises.put(idiomas[i], pLocale[i]);
            }
        }                
    }
    
    public Map<String, String> getMapPaises() {
        return paises;
    }
 
    public String getLocaleCode() {
        return localeCode;
    }
 
    public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
    }

  //public void alteraLocaleCodePaises(AjaxBehaviorEvent e){    
    public void alteraLocaleCodePaises(ValueChangeEvent e){
        String newLocaleValue = e.getNewValue().toString();
        String localeSelecao = "";
        //Procura o Locale definido para este sistema
        for (Map.Entry<String, String> entry : paises.entrySet()) {
            if(((String)entry.getValue()).equalsIgnoreCase(newLocaleValue)) {
               localeSelecao = (String)entry.getValue(); 
               if ("pt_BR".equals(localeSelecao))
                   FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("pt","BR"));
               else 
               if ("en".equals(localeSelecao))
                   FacesContext.getCurrentInstance().getViewRoot().setLocale(Locale.ENGLISH);
               else continue;
               FacesContext.getCurrentInstance().renderResponse();
               setLocaleCode(newLocaleValue);
               createMapIdiomas(); //Refaz a Internacionalizacao para idioma escolhido
               break;
            }
        }
    }
}
